今から始めるServerless Frameworkで簡単Lambda開発環境の構築
こんにちは、臼田です。
皆さん、AWS Lambdaは使っていますか?
ちょっとしたスクリプトの実行から、様々なピタゴラ装置までこなせるLambdaはいいですよね。
でも、Lambdaのスクリプトを作成するときのデバッグや、外部プラグイン等も含めてパッケージングしてアップロードするなどのデプロイはちょっと面倒ですよね。
でも、Serverless Frameworkを使えば、ローカル環境でのデバッグも出来ますし、デプロイもあっという間です。
今回は、今からでも始められる、Serverless Frameworkを利用したLambdaの開発環境構築についてまとめました。
はじめに
Serverless Frameworkをインストールする前に、以下の環境を準備してください。
- node.js (npm) v4以上
- awsアカウント
- awscli
node.jsについては、nodebrew
等で準備するのもいいかと思います。
awscli
は下記が参考になります。
私の環境は以下のようになっています。
$ node -v v4.3.2 $ aws --version aws-cli/1.11.44 Python/2.7.10 Darwin/16.4.0 botocore/1.5.7
使ってみる
Serverless Frameworkのインストール
まずは、npm
からインストールします。
$ npm install -g serverless
完了したら、動作を確認します。
$ serverless -v WARNING: You are running v1.7.0. v1.8.0 will include the following breaking changes: - Will replace IamPolicyLambdaExecution resource with inline policies -> https://git.io/vDilm - "sls info" will output the short function name rather than the lambda name -> https://git.io/vDiWx You can opt-out from these warnings by setting the "SLS_IGNORE_WARNING=*" environment variable. 1.7.0
今回利用したのはversion 1.7なのですが、1.8にて重要な修正が入るため、警告が表示されます。 以降、メッセージを表示する必要はあまりないと思いますので、環境変数を設定して表示を止めます。
$ export SLS_IGNORE_WARNING=* $ sls -v 1.7.0
これで、警告が表示されなくなりました。bashrcに追記してもいいと思います。
ちなみに、serverless
コマンドは長いので、エイリアスとしてsls
が登録されています。
上記のようにサラッと書けるので、以後はこれを使います。
また、sls
コマンドをそのまま実行すると、利用できるサブコマンドが確認できるので、合わせてみておくといいかもしれません。
$ sls Commands * Serverless documentation: http://docs.serverless.com * You can run commands with "serverless" or the shortcut "sls" * Pass "--help" after any <command> for contextual help config credentials ............ Configures a new provider profile for the Serverless Framework create ........................ Create new Serverless service install ....................... Install a Serverless service from GitHub deploy ........................ Deploy a Serverless service deploy function ............... Deploy a single function from the service deploy list ................... List deployed version of your Serverless Service invoke ........................ Invoke a deployed function invoke local .................. Invoke function locally info .......................... Display information about the service logs .......................... Output the logs of a deployed function metrics ....................... Show metrics for a specific function remove ........................ Remove Serverless service and all resources rollback ...................... Rollback the Serverless service to a specific deployment
AWSアカウントの設定
続いて、AWSのアカウントの設定を行います。
Serverless Frameworkでは、awscli
で設定してあるcredentialを利用しています。
設定してある方はそのまま次へ進んでも大丈夫ですが、注意点があります。
Serverless Frameworkの公式ドキュメントには下記のようにあります。
To let the Serverless Framework access your AWS account, we're going to create an IAM User with Admin access, which can configure the services in your AWS account. This IAM User will have its own set of AWS Access Keys.
現状では、Serverless Frameworkを利用するのにAdministratorAccessのポリシーが必要になります。 これは、Serverless Frameworkが急速に開発が進んでいるため、まだ必要な権限を絞れないためです。 実運用での利用の際には詳細を把握して、権限管理をする必要がありますが、 今回は開発環境が目的なため、公式ドキュメント通りに設定します。
マネージメントコンソールにログインしてIAMへアクセスします。 ダッシュボードから「ユーザー」へ移動し、「ユーザを追加」を押します。
ユーザ名に適切なものを設定し、アクセスの種類で「プログラムによるアクセス」にチェックを入れ次へ進めます。
権限設定で「既存のポリシーを直接アタッチ」を選択して、検索欄から「AdministratorAccess」を検索して選び、次に進みます。
確認画面が出てくるので、「ユーザーの作成」を押します。
ユーザーの作成が完了するので、「アクセスキーID」と「シークレットアクセスキー」を控えてください。 「シークレットアクセスキー」は「表示」を押すことにより確認できます。
続いて、作成したIAMユーザーをServerless Frameworkで設定します。
とはいっても、実際にはaws configure
コマンドのラッパーです。
下記sls
コマンド以外に、awscli
で設定しても構いません。
sls config credentials --provider aws --key XXXXXXXXXXXXEXAMPLE --secret XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEXAMPLEKEY Serverless: Setting up AWS... Serverless: Saving your AWS profile in "~/.aws/credentials"... Serverless: Success! Your AWS access keys were stored under the "default" profile.
aws configure
のdefault設定がすでに入っている場合には、--profileオプションで新しいプロファイルを指定しましょう。
これがないとエラーになります。
catで設定が追加されていることを確認します。
$ cat ~/.aws/credentials [default] aws_access_key_id=XXXXXXXXXXXXEXAMPLE aws_secret_access_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXEXAMPLEKEY
これで準備が整いました。
サービスを作成してデプロイ
ここからは、ほぼ一瞬で終わってしまいます。 それがServerless Frameworkの魅力です。
まず、新規のサービスを作成します。 サービスは、Serverless Frameworkでの実行環境になります。
$ sls create -t aws-python -p slstest Serverless: Generating boilerplate... Serverless: Generating boilerplate in "/your/folder/slstest" _______ __ | _ .-----.----.--.--.-----.----| .-----.-----.-----. | |___| -__| _| | | -__| _| | -__|__ --|__ --| |____ |_____|__| \___/|_____|__| |__|_____|_____|_____| | | | The Serverless Application Framework | | serverless.com, v1.7.0 -------' Serverless: Successfully generated boilerplate for template: "aws-python" $ ls slstest/ handler.py serverless.yml
これでslstestフォルダにサービスと、テンプレートのpythonファンクションが作成されました。 中身は以下のようになっています。
handler.py
lambdaファンクションのテンプレートです。 中身にはテスト用のhelloファンクションが定義されています。
serverless.yml
Serverless Frameworkの設定が記載されています。
sls create
コマンドのオプションは以下のようになっています。
$ sls create --help Plugin: Create create ........................ Create new Serverless service --template / -t (required) ......... Template for the service. Available templates: "aws-nodejs", "aws-python", "aws-java-maven", "aws-java-gradle", "aws-scala-sbt", "aws-csharp", "openwhisk-nodejs" and "plugin" --path / -p ........................ The path where the service should be created (e.g. --path my-service) --name / -n ........................ Name for the service. Overwrites the default name of the created service.
今回はpythonを利用するため、テンプレートにaws-python
を選びました。
また、新規のスクリプト作成だったので、PATHの指定を行いました。
slstestフォルダが作成されたのはPATHを指定したためです。
既存のものがある場合には、スクリプトが存在するフォルダで-pを利用しないでsls create
すればOKです。
デプロイ先のリージョン設定など、細かい部分はserverless.ymlを編集することになりますが、まずは動きを確認するためにslstestフォルダに移動してデプロイをしてみます。
$ cd slstest/ $ sls deploy Serverless: Creating Stack... Serverless: Checking Stack create progress... ..... Serverless: Stack create finished... Serverless: Packaging service... Serverless: Uploading CloudFormation file to S3... Serverless: Uploading service .zip file to S3 (639 B)... Serverless: Updating Stack... Serverless: Checking Stack update progress... .................. Serverless: Stack update finished... Service Information service: slstest stage: dev region: us-east-1 api keys: None endpoints: None functions: slstest-dev-hello
これでデプロイ完了です。
sls deploy
一発で終わりです。
本当に、非常に簡単です。
内部的には、CloudFormationのスタックを作成し、それに基づいてIAMやLambda等の設定が行われています。
テストする
デプロイが終わったのでテストしてみます。
$ sls invoke -f hello { "body": "{\"input\": {}, \"message\": \"Go Serverless v1.0! Your function executed successfully!\"}", "statusCode": 200 }
はい、テストも非常に簡単です。
sls invoke
コマンドは下記のようになっています。
$ sls invoke --help Plugin: Invoke invoke ........................ Invoke a deployed function invoke local .................. Invoke function locally --function / -f (required) ......... The function name --stage / -s ....................... Stage of the service --region / -r ...................... Region of the service --path / -p ........................ Path to JSON or YAML file holding input data --type / -t ........................ Type of invocation --log / -l ......................... Trigger logging data output --data / -d ........................ input data
上記はデータを何も渡さずに実行していますが、データを渡す場合には-dを利用します。
$ sls invoke -f hello -d '{"key":"value"}' { "body": "{\"input\": {\"key\": \"value\"}, \"message\": \"Go Serverless v1.0! Your function executed successfully!\"}", "statusCode": 200 }
inputにデータが渡されていることが確認できます。
更に、sls invoke local
コマンドを利用すれば、ローカルデバッグも出来ちゃいます。
リモートとローカルのデバッグがほぼ同じコマンドで出来るので、これまた楽ですね。
ローカルデバッグについては下記を参照してください。
serverless.ymlを編集する
リージョンなどの設定はserverless.ymlにあります。
# you can overwrite defaults here # stage: dev region: ap-northeast-1 # ここのコメントアウトを外して編集します
設定を保存して、もう一度実行してみます。 ついでに、-vオプションを利用して詳細な動作を確認します。
$ sls deploy -v Serverless: Creating Stack... Serverless: Checking Stack create progress... CloudFormation - CREATE_IN_PROGRESS - AWS::CloudFormation::Stack - slstest-dev CloudFormation - CREATE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket CloudFormation - CREATE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket CloudFormation - CREATE_COMPLETE - AWS::S3::Bucket - ServerlessDeploymentBucket CloudFormation - CREATE_COMPLETE - AWS::CloudFormation::Stack - slstest-dev Serverless: Stack create finished... Serverless: Packaging service... Serverless: Uploading CloudFormation file to S3... Serverless: Uploading service .zip file to S3 (639 B)... Serverless: Updating Stack... Serverless: Checking Stack update progress... CloudFormation - CREATE_COMPLETE - AWS::S3::Bucket - ServerlessDeploymentBucket CloudFormation - CREATE_COMPLETE - AWS::CloudFormation::Stack - slstest-dev CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - slstest-dev CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution CloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup CloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution CloudFormation - CREATE_COMPLETE - AWS::Logs::LogGroup - HelloLogGroup CloudFormation - CREATE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecution CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Policy - IamPolicyLambdaExecution CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Policy - IamPolicyLambdaExecution CloudFormation - CREATE_COMPLETE - AWS::IAM::Policy - IamPolicyLambdaExecution CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction CloudFormation - CREATE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionnjv8umhHX8AljD0VKQUqojKkzU2huW1AkaSample CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionnjv8umhHX8AljD0VKQUqojKkzU2huW1AkaSample CloudFormation - CREATE_COMPLETE - AWS::Lambda::Version - HelloLambdaVersionnjv8umhHX8AljD0VKQUqojKkzU2huW1AkaSample CloudFormation - UPDATE_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - slstest-dev CloudFormation - UPDATE_COMPLETE - AWS::CloudFormation::Stack - slstest-dev Serverless: Stack update finished... Service Information service: slstest stage: dev region: ap-northeast-1 api keys: None endpoints: None functions: slstest-dev-hello Stack Outputs HelloLambdaFunctionQualifiedArn: arn:aws:lambda:ap-northeast-1:000000000000:function:slstest-dev-hello:1 ServerlessDeploymentBucketName: slstest-dev-serverlessdeploymentbucket-1s9cy3sample
region: ap-northeast-1
となり、東京リージョンにデプロイされていることがわかります。
また、-vオプションを利用したことにより、CloudFormationやIAM等がどのように動いているかがよく見えます。
サービスの削除
さて、東京リージョンにもデプロイしたので、最初にバージニアリージョンにデプロイしたものを削除します。
削除にはsls remove
コマンドを利用します。
$ sls remove --help Plugin: Remove remove ........................ Remove Serverless service and all resources --stage / -s ....................... Stage of the service --region / -r ...................... Region of the service --verbose / -v ..................... Show all stack events during deployment
今回は、設定と異なるリージョンのサービスを削除するので-rオプションを利用します。
$ sls remove -r us-east-1 -v Serverless: Getting all objects in S3 bucket... Serverless: Removing objects in S3 bucket... Serverless: Removing Stack... Serverless: Checking Stack removal progress... CloudFormation - DELETE_IN_PROGRESS - AWS::CloudFormation::Stack - slstest-dev CloudFormation - DELETE_SKIPPED - AWS::Lambda::Version - HelloLambdaVersionAX4wJlYuRhqF6SM5faSInYd2cazQ6N8noFbY7Sample CloudFormation - DELETE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction CloudFormation - DELETE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction CloudFormation - DELETE_IN_PROGRESS - AWS::IAM::Policy - IamPolicyLambdaExecution CloudFormation - DELETE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket CloudFormation - DELETE_COMPLETE - AWS::IAM::Policy - IamPolicyLambdaExecution CloudFormation - DELETE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution CloudFormation - DELETE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup CloudFormation - DELETE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecution CloudFormation - DELETE_COMPLETE - AWS::Logs::LogGroup - HelloLogGroup CloudFormation - DELETE_COMPLETE - AWS::S3::Bucket - ServerlessDeploymentBucket Serverless: Stack removal finished...
削除が完了しました。
CloudFormationを利用しているので、削除も非常に簡単です。
さいごに
サービスの作成からデプロイ、削除までサクッと出来ました。
これでLambdaを利用するときに、面倒くさいことはあまりやらなくても効率化出来ると思います。
最後に、pythonの外部モジュールを利用する際にも、効率化出来るブログを紹介します。
Serverless Frameworkを利用して、快適なLambdaライフを送りましょう!